﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Citas.Negocio;
using Citas.Dominio;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;

namespace Citas.Controllers
{
    public class CitaController : Controller
    {
        //Dependencias
        public IAdministracionService adminService { get; set; }

        //
        // GET: /Cita/

        public ActionResult Index()
        {
            TempData["paciente"] = ListarPacientes();
            TempData["medicoEspecialidad"] = ListarMedicoEspecialidad();
            TempData["estado"] = ListarEstados();
            
            ICollection<Cita> modelo = adminService.ListarCitas();
            return View(modelo);
        }

        public ActionResult BuscarXPaciente(string paciente)
        {
            ICollection<Cita> modelo = adminService.ListarCitasXPaciente(paciente);
            return View("Index", modelo);
        }

        public ActionResult BuscarXNumero(int numero)
        {
            ICollection<Cita> modelo = adminService.ListarCitasXNumero(numero);
            return View("Index", modelo);
        }

        //
        // GET: /Cita/Details/5

        public ActionResult Details(int id)
        {
            Cita modelo = adminService.ObtenerCita(id);
            return View(modelo);
        }

        // GET: /Cita/Seguro/5

        public ActionResult Seguro(int id, string documento)
        {
            Cita modelo = adminService.ObtenerCita(id);

            /*
            SeguroWS.Seguros seguro = new SeguroWS.Seguros();

            if (seguro.ObtenerSeguro(documento) == null)
            {
                TempData["seguro_mensaje"] = "El paciente no está asegurado";
                TempData["seguro_codigo"] = null;
                TempData["seguro_edad"] = null;
                TempData["seguro_telefono"] = null;
            }
            else
            {
                TempData["seguro_mensaje"] = "El paciente está asegurado";
                TempData["seguro_codigo"] = seguro.ObtenerSeguro(documento).CodigoSeguro;
                TempData["seguro_edad"] = seguro.ObtenerSeguro(documento).Edad;
                TempData["seguro_telefono"] = seguro.ObtenerSeguro(documento).Telefono;
            }    
             */

            WSPacienteInfo.WSPacienteInfo seguro = new WSPacienteInfo.WSPacienteInfo();

            if (seguro.getPacienteInfo(documento) != null)
            {
                if (seguro.getPacienteInfo(documento).esTitular == "Si")
                {
                    TempData["seguro_mensaje"] = "El paciente es titular";
                }
                else
                {
                    TempData["seguro_mensaje"] = "El paciente no es titular";
                }
                TempData["seguro_edad"] = seguro.getPacienteInfo(documento).edad;
                TempData["seguro_telefono"] = seguro.getPacienteInfo(documento).telefono;
                TempData["seguro_codigo"] = "00DR56HJ0017800";
            }
            else
            {
                TempData["seguro_mensaje"] = "El paciente no está asegurado";
                TempData["seguro_edad"] = null;
                TempData["seguro_telefono"] = null;
            }
            

            // eps
            //HttpWebRequest reqAtencion = (HttpWebRequest)WebRequest.Create("http://localhost:3146/InfoSeguro.svc/AseguradosEps/" + documento);
            HttpWebRequest reqAtencion = (HttpWebRequest)WebRequest.Create("http://localhost:3146/ServicioInformacionSeguro.svc/Asegurados/" + documento);
            reqAtencion.Method = "GET";
            HttpWebResponse resAtencion = (HttpWebResponse)reqAtencion.GetResponse();
            StreamReader readerAtencion = new StreamReader(resAtencion.GetResponseStream());
            String atencionJson = readerAtencion.ReadToEnd();
            JavaScriptSerializer jsAtencion = new JavaScriptSerializer();

            Eps epsObtenida = jsAtencion.Deserialize<Eps>(atencionJson);

            TempData["eps_dni"] = documento;
            TempData["eps_nombre"] = epsObtenida.nombre;
            TempData["eps_apellido"] = epsObtenida.apellido;
            TempData["eps_titular"] = epsObtenida.esTitular;
            TempData["eps_descripcion"] = epsObtenida.descripcion;
            TempData["eps_coseguro"] = epsObtenida.coseguro;
            TempData["eps_deducible"] = epsObtenida.deducible;

            return View(modelo);
        }

        //
        // GET: /Cita/Create

        public ActionResult Create()
        {
            TempData["paciente"] = ListarPacientes();
            TempData["medicoEspecialidad"] = ListarMedicoEspecialidad();
            TempData["estado"] = ListarEstados();
            return View();
        }

        //
        // POST: /Cita/Create

        [HttpPost]
        public ActionResult Create(FormCollection collection)
        {
            try
            {
                // TODO: Add insert logic here
                Cita b = adminService.RegistrarCita(
                    DateTime.Parse(collection["FechaHora"]),
                    int.Parse(collection["Paciente"]),
                    int.Parse(collection["MedicoEspecialidad"]),
                    (String)collection["NumeroConsultorio"], 
                    Double.Parse(collection["Precio"]), 
                    (String)collection["Estado"]                            
                );

                TempData["paciente"] = ListarPacientes();
                TempData["medicoEspecialidad"] = ListarMedicoEspecialidad();
                TempData["estado"] = ListarEstados();
                    
                return RedirectToAction("Index");

            }

            catch (Exception ex)
            {
                ModelState.AddModelError(string.Empty, ex.Message);
                TempData["paciente"] = ListarPacientes();
                TempData["medicoEspecialidad"] = ListarMedicoEspecialidad();
                TempData["estado"] = ListarEstados();
                return View("Create");
            }
        }

        //
        // GET: /Cita/Edit/5

        public ActionResult Edit(int id)
        {
            TempData["paciente"] = ListarPacientes();
            TempData["medicoEspecialidad"] = ListarMedicoEspecialidad();
            TempData["estado"] = ListarEstados();
            
            return View(adminService.ObtenerCita(id));          
        }

        //
        // POST: /Cita/Edit/5

        [HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {
            try
            {
                Int32 numero = int.Parse(collection["Numero"]);
                DateTime fecha = DateTime.Parse(collection["FechaHora"]);
                Int32 paciente = int.Parse(collection["Paciente.Codigo"]);
                Int32 medicoEspecialidad = int.Parse(collection["MedicoEspecialidad.Codigo"]);
                String consultorio = (String)(collection["NumeroConsultorio"]);
                Double precio = Double.Parse(collection["Precio"]);
                String estado = (String)(collection["Estado"]);

                Cita b = adminService.ModificarCita(
                    numero,
                    fecha,
                    paciente,
                    medicoEspecialidad,
                    consultorio,
                    precio,
                    estado
                );
                                    
                return RedirectToAction("Index");

            }
            catch (Exception ex)
            {
                ModelState.AddModelError(
                string.Empty, ex.Message);
                TempData["paciente"] = ListarPacientes();
                TempData["medicoEspecialidad"] = ListarMedicoEspecialidad();
                TempData["estado"] = ListarEstados();
                return View("Edit");
            }
        }

        //Reprogramar GET
        public ActionResult Reprogramar(int id)
        {
            TempData["paciente"] = ListarPacientes();
            TempData["medicoEspecialidad"] = ListarMedicoEspecialidad();
            TempData["estado"] = ListarEstados();

            return View(adminService.ObtenerCita(id));
        }

        [HttpPost]
        public ActionResult Reprogramar(int id, FormCollection collection)
        {
            try
            {
                Cita b = adminService.ModificarCita(
                    int.Parse(collection["Numero"]),
                    DateTime.Parse(collection["FechaHora"]),
                    adminService.ObtenerCita(id).Paciente.Codigo,
                    adminService.ObtenerCita(id).MedicoEspecialidad.Codigo,
                    adminService.ObtenerCita(id).NumeroConsultorio,
                    adminService.ObtenerCita(id).Precio,
                    adminService.ObtenerCita(id).Estado
                );

                return RedirectToAction("Index");

            }
            catch (Exception ex)
            {
                ModelState.AddModelError(
                string.Empty, ex.Message);
                TempData["paciente"] = ListarPacientes();
                TempData["medicoEspecialidad"] = ListarMedicoEspecialidad();
                TempData["estado"] = ListarEstados();
                return View("Reprogramar");
            }
        }
        

        //
        // GET: /Cita/Delete/5

        public ActionResult Delete(int id)
        {
            Cita modelo = adminService.ObtenerCita(id);

            return View(modelo);
        }

        //
        // POST: /Cita/Delete/5

        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            try
            {
                Cita citaAEliminar = adminService.ObtenerCita(id);
                adminService.EliminarCita(citaAEliminar);
                TempData["mensaje"] = "Cita " + citaAEliminar.Numero + " eliminada exitosamente";
                return RedirectToAction("Index"); // Todo bien, a la lista
            }
            catch
            {
                return View();
            }

        }


        // Anular GET
        public ActionResult Anular(int id)
        {
            return View(adminService.ObtenerCita(id));
        }

        //
        // POST: /Cita/Anular/5

        [HttpPost]
        public ActionResult Anular(int id, FormCollection collection)
        {
            try
            {
                Cita cita = adminService.ObtenerCita(id);

                Cita b = adminService.ModificarCita(
                    cita.Numero,
                    cita.FechaHora,
                    cita.Paciente.Codigo,
                    cita.MedicoEspecialidad.Codigo,
                    cita.NumeroConsultorio,
                    cita.Precio,
                    "ANULADA"
                );

                TempData["paciente"] = ListarPacientes();
                TempData["medicoEspecialidad"] = ListarMedicoEspecialidad();
                TempData["estado"] = ListarEstados();
                
                return RedirectToAction("Index");

            }
            catch (Exception ex)
            {
                ModelState.AddModelError(
                string.Empty, ex.Message);
                TempData["paciente"] = ListarPacientes();
                TempData["medicoEspecialidad"] = ListarMedicoEspecialidad();
                TempData["estado"] = ListarEstados();
                return View("Anular");
            }
        }


        // POST: /Cita/MostrarSeguro/5
        [HttpPost]
        public ActionResult MostrarSeguro(string documento, FormCollection collection)
        {
            try
            {
                TempData["paciente"] = ListarPacientes();
                TempData["medicoEspecialidad"] = ListarMedicoEspecialidad();
                TempData["estado"] = ListarEstados();

                Cita modelo = new Cita();
                
                modelo.Numero = int.Parse(collection["Numero"]);
                modelo.FechaHora = DateTime.Parse(collection["FechaHora"]);
                modelo.Paciente = adminService.ObtenerPaciente(int.Parse(collection["Paciente.Codigo"]));
                modelo.MedicoEspecialidad = adminService.ObtenerMedicoEspecialidad(int.Parse(collection["MedicoEspecialidad.Codigo"]));
                modelo.NumeroConsultorio = (String)(collection["NumeroConsultorio"]);
                modelo.Precio = Double.Parse(collection["Precio"]);
                modelo.Estado = (String)(collection["Estado"]);
                
                WSPacienteInfo.WSPacienteInfo seguro = new WSPacienteInfo.WSPacienteInfo();

                if (seguro.getPacienteInfo(documento) != null)
                {
                    if (seguro.getPacienteInfo(documento).esTitular == "Si")
                    {
                        TempData["seguro_mensaje"] = "El paciente es titular";
                    }
                    else
                    {
                        TempData["seguro_mensaje"] = "El paciente no es titular";
                    }
                    TempData["seguro_edad"] = seguro.getPacienteInfo(documento).edad;
                    TempData["seguro_telefono"] = seguro.getPacienteInfo(documento).telefono;
                    TempData["seguro_codigo"] = "00DR56HJ0017800";
                }
                else
                {
                    TempData["seguro_mensaje"] = "El paciente no está asegurado";
                    TempData["seguro_edad"] = null;
                    TempData["seguro_telefono"] = null;
                }
                
                return View("Create", modelo); 
            }
            catch
            {
                return View();
            }

        }

        //Pacientes
        private ICollection<SelectListItem> ListarPacientes()
        {
            ICollection<SelectListItem> pacientes = new List<SelectListItem>();
            pacientes.Add(new SelectListItem() { Value = string.Empty, Text = "::. Seleccione .::" });
            foreach (Paciente paciente in adminService.ListarPaciente())
                pacientes.Add(new SelectListItem()
                {
                    Value = paciente.Codigo.ToString(),
                    Text = paciente.ApellidoPaterno + " " + paciente.ApellidoMaterno + ", " + paciente.Nombres
                });
            return pacientes;
        }

        //MedicoEspecialidad
        private ICollection<SelectListItem> ListarMedicoEspecialidad()
        {
            ICollection<SelectListItem> mes = new List<SelectListItem>();
            mes.Add(new SelectListItem() { Value = string.Empty, Text = "::. Seleccione .::" });
            foreach (MedicoEspecialidad medicoEspecialidad in adminService.ListarMedicoEspecialidad())
                mes.Add(new SelectListItem()
                {
                    Value = medicoEspecialidad.Codigo.ToString(),
                    Text = medicoEspecialidad.Especialidad.Descripcion + " - Dr. " + medicoEspecialidad.Medico.Nombre
                });
            return mes;
        }

        //Estados
        private ICollection<SelectListItem> ListarEstados()
        {
            ICollection<SelectListItem> cargos = new List<SelectListItem>();
            cargos.Add(new SelectListItem() { Value = string.Empty, Text = "::. Seleccione .::" });
            cargos.Add(new SelectListItem() { Value = "PENDIENTE", Text = "Pendiente" });
            cargos.Add(new SelectListItem() { Value = "ATENDIDA", Text = "Atendida" });
            cargos.Add(new SelectListItem() { Value = "ANULADA", Text = "Anulada" });

            return cargos;
        }
    }
}
